Interrupt L'interrupt (in italiano interruzione) è un segnale che viene inviato dall'hardware (quasi sempre adibito a mansioni di I/O) al microprocessore che interrompe per questo il normale corso di elaborazione del programma per andare ad eseguire una particolare routine (detta interrupt server o servitore dell'interruzione) che risolverà la particolare situazione del sistema; ad esempio un classico caso di interrupt è la tastiera: appena l'utente preme un tasto, l'interfaccia della tastiera invia un interrupt al microprocessore, il quale esegue la routine di interruzione che preleva il codice del tasto premuto; in questa maniera si evita che il microprocessore verfichi sempre se un tasto è premuto (polling) risparmiando così, un notevole numero di cicli macchina; potete osservare la lista delle diverse interruzioni nella tabella apposita. Accanto a questo tipo di interrupt denominati hardware vi sono i software interrupts, cioè interrupt provocati dal software (dal task quindi); voi direte: a questo punto conviene creare un subroutine da chiamare quando serve e si ottiene lo stesso risultato! Invece non è proprio la stessa cosa, poiché le interrupt software hanno una priorità più alta dei task (e più bassa delle interrupt hardware) quindi eseguendo un interrupt software il multitasking è momentaneamente disattivato. La struttura che definisce un'interrupt sia software che hardware è la seguente: struct Interrupt { struct Node is_Node; APTR id_Data; VOID (*is_Code)(); }; dove is_Node indica che l'interrupt è mantenuta in una lista del s.o. e devono essere definite le sue caratteristiche, priorità, nome e tipo (NT_INTERRUPT); is_Data è un puntatore ad un buffer dati gestito dal programmatore per passare all'interrupt, dati che possono essere utili; is_Code è il puntatore alla routine di interrupt. Le funzioni di exec che servono per l'installazione di interrupt sono: vecchiaint = (struct Interrupt *)SetIntVector(tipoint,nuovaint); dove "tipoint" è una costante definita in che indica a quale interrupt hardware installare il server identificato dal puntatore alla struttura Interrupt "nuovaint"; "vecchiaint" è il puntatore alla struttura Interrupt del server che viene rimpiazzato; questa funzione esclude il codice di interrupt esistente, e questo potrebbe causare qualche problema al sistema a cui potrebbe servire l'interrupt, quindi va usata con cautela. AddIntServer(tipoint,nuovaint); Questa funzione invece aggiunge l'interrupt a quelle già esistenti; praticamente quando si verifica l'interrupt di tipo "tipoint" il sistema scandirà una lista (ordinata per priorità) con i diversi interrupt servers e li eseguirà tutti; questo metodo quindi non mette in pericolo il perfetto funzionamento del sistema; per eliminare l'interrupt dalla lista dei servers occorre chiamare RemIntServer con gli stessi parametri della AddIntServer. La funzione per chiamare un'interrupt software è questa: Cause(inter); dove "inter" è il puntatore ad una struttura Interrupt. In realtà come abbiamo visto la puntata scorsa l'interrupt software può essere chiamata da una porta appena giunge un messaggio ponendo in mp_Flags PA_SOFTINT e in mp_SigTask il puntatore alla struttura Interrupt relativa.